horizontal and vertical microprogramming in computer architecture